/*
 * CLASSE que irá implementar a interface CLIENTEDAO
 */

package br.com.jkar.dao;

import br.com.jkar.bean.Cliente;
import br.com.jkar.bean.Endereco;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Kamila Berto <kah.berto@gmail.com>
 */
public class ClienteDAOImpl implements ClienteDAO {
    
    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

    private static final String IDCLIENTE = "c.pessoa_id";
    private static final String NOME = "nome";
    private static final String CPF = "cpf";
    private static final String RG = "rg";
    private static final String EMAIL = "email";
    private static final String TEL = "telfixo";
    private static final String CEL = "celular";
    private static final String IDEND = "e.id";
    private static final String RUA = "rua";
    private static final String BAIRRO = "bairro";
    private static final String CIDADE = "cidade";
    private static final String ESTADO = "estado";
    private static final String CEP = "cep";

    @Override
    public Cliente salvar(Cliente cliente) throws Exception {
        PessoaDAO pessoaDAO = new PessoaDAOImpl();
        pessoaDAO.salvar(cliente);
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "INSERT INTO cliente (fidelidade, pessoa_id) VALUES (?, ?)";
            pst = conn.prepareStatement(stmt);
            pst.setString(1, cliente.getFidelidade());
            pst.setInt(2, cliente.getId());
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao gravar dados do cliente no BD: " + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return cliente;
    }

    @Override
    public Cliente alterar(Cliente cliente) throws Exception {
        PessoaDAO pessoaDAO = new PessoaDAOImpl();
        pessoaDAO.alterar(cliente);
        return cliente;
    }

    @Override
    public void excluir(Integer id) throws Exception {
        System.out.println("Excluindo o cliente selecionado...");
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "DELETE FROM endereco WHERE id = ?";
            pst = conn.prepareStatement(stmt);
            pst.setInt(1, id);
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao excluir os dados do cliente: " + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
    }
    
    private Cliente setarCliente(ResultSet rs, Cliente cliente){
        try {
            cliente.setId(rs.getInt(IDCLIENTE));
            cliente.setNome(rs.getString(NOME));
            cliente.setCpf(rs.getString(CPF));
            cliente.setRg(rs.getString(RG));
            cliente.setEmail(rs.getString(EMAIL));
            cliente.setTelFixo(rs.getString(TEL));
            cliente.setCelular(rs.getString(CEL));
            cliente.setEndereco(new Endereco());
            cliente.getEndereco().setRua(rs.getString(RUA));
            cliente.getEndereco().setBairro(rs.getString(BAIRRO));
            cliente.getEndereco().setCidade(rs.getString(CIDADE));
            cliente.getEndereco().setEstado(rs.getString(ESTADO));
            cliente.getEndereco().setCep(rs.getString(CEP));
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
                return cliente;
    }

    @Override
    public List<Cliente> listarPorNome(String nome) throws Exception {
        List<Cliente> clientes = new ArrayList<>();
//        Cliente cliente = null;
        Cliente cliente;
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM cliente c "
                    + "JOIN pessoa p ON c.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "WHERE p.nome LIKE ?";
            pst = conn.prepareStatement(stmt);
            pst.setString(1, "%" + nome + "%");
            rs = pst.executeQuery();
            while (rs.next()) {
                cliente = new Cliente();
                clientes.add(setarCliente(rs, cliente));
            }
        } catch (Exception e) {
            System.out.println("Erro ao listar os dados do cliente: "
                    + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return clientes;
    }

    @Override
    public List<Cliente> listar() throws Exception {
        List<Cliente> clientes = new ArrayList<>();
        Cliente cliente;
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM cliente c "
                    + "JOIN pessoa p ON c.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id";
            pst = conn.prepareStatement(stmt);
            rs = pst.executeQuery();
            while (rs.next()) {
                cliente = new Cliente();
                clientes.add(setarCliente(rs, cliente));
            }
        } catch (Exception e) {
            System.out.println("Erro ao listar os dados do cliente: " 
                + e.getMessage());
        }finally{
            FabricarConexao.fecharConexao(conn, pst);
        }
        return clientes;
    }

    @Override
    public Cliente procurar(Integer id) throws Exception {
        System.out.println("Pesquisando ID do item selecionado...");
        Cliente cliente = new Cliente();
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM cliente c "
                    + "JOIN pessoa p ON c.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "WHERE c.pessoa_id = ?";
            pst = conn.prepareStatement(stmt);
//            pst = conn.prepareStatement("SELECT * FROM cliente WHERE id = ?");
            pst.setInt(1, id);
            rs = pst.executeQuery();
            rs.next();
            setarCliente(rs, cliente);
        } catch (Exception e) {
            System.out.println("Erro ao procurar item por ID no BD: " + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return cliente;
    }

}
